package org.dromara.community.controller;

import cn.hutool.core.util.ObjUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.dromara.comm_lhz.util.QiniuUtil;
import org.dromara.community.entity.AsNoticeImage;
import org.dromara.community.entity.dto.AsCommunityAnnouncementsDTO;
import org.dromara.community.mapper.AsNoticeImageMapper;
import org.dromara.community.service.AsNoticeImageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("noticeImage")
@Tag(name = "图片操作")
public class AsNoticeImageController {


    @Autowired
    private AsNoticeImageService asNoticeImageService;

    @Autowired
    private QiniuUtil qiniuUtil;

    @Autowired
    private AsNoticeImageMapper asNoticeImageMapper;


    /**
     * 上传图片并新增公告。
     * 该接口用于处理客户端上传图片并创建新公告的请求。
     * 具体操作包括验证上传的文件不为空，上传图片到七牛云存储，创建并保存公告信息。
     *
     * @param file 上传的图片文件，通过MultipartFile类型接收。
     * @param id   公告关联的ID，可选参数。
     * @return 返回一个包含消息和图片URL的Map，以及HTTP状态码。
     */
    @Operation(summary = "上传图片并新增公告")
    @PostMapping("/uploadAsNotice")
    public ResponseEntity<Map<String, Object>> uploadImageAndAddAnnouncement(
        @RequestParam(value = "file") MultipartFile file,
        @RequestParam(value = "imageId") Long id, @RequestParam(value = "imageId") Integer imageId) {

        Map<String, Object> response = new HashMap<>();

        try {
            // 验证上传的文件不为空
            // 验证文件是否为空
            if (file.isEmpty()) {
                response.put("message", "文件不能为空");
                return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);
            }

            // 上传图片到七牛云存储，并获取图片URL
            // 上传图片
            String imageUrl = qiniuUtil.uploadImage(file);

            // 创建公告DTO，设置公告的各类属性
            // 创建公告DTO
            AsNoticeImage asNoticeImage = new AsNoticeImage();
            asNoticeImage.setImageId(imageId);
            asNoticeImage.setUrl(imageUrl);  // Set the uploaded image URL

            // 保存公告信息
            // 保存公告
            asNoticeImageService.save(asNoticeImage);

            // 构建响应，通知客户端公告创建成功，并提供图片URL
            response.put("message", "图片上传成功");
            response.put("imageUrl", imageUrl);
            return new ResponseEntity<>(response, HttpStatus.OK);

        } catch (Exception e) {
            // 处理异常情况，构建响应，通知客户端发生错误
            response.put("message", "发生错误：" + e.getMessage());
            return new ResponseEntity<>(response, HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }

    /**
     * 上传图片并新增公告
     *
     * @param file    上传的文件
     * @param imageId 旧图片ID，用于删除旧图片（可选）
     * @return 包含上传结果和图片URL的响应实体
     */
    @Operation(summary = "修改公告图片")
    @PostMapping("/modificationAsNotice")
    public ResponseEntity<Map<String, Object>> uploadUploadAsNotice(
        @RequestParam(value = "file") MultipartFile file,
//        @RequestParam(value = "id", required = false) Long id,
        @RequestParam(value = "imageId", required = false) Integer imageId) {

        // 响应容器
        Map<String, Object> response = new HashMap<>();

        // 验证上传的文件是否为空
        if (file.isEmpty()) {
            response.put("message", "文件不能为空");
            return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);
        }

        try {
            // 删除旧的图片（如果有）
            if (imageId != null) {
                // 根据 imageId 查询相关公告图片记录
                QueryWrapper<AsNoticeImage> wrapper = new QueryWrapper<>();
                wrapper.eq("image_id", imageId); // 这里根据实际字段调整条件
                List<AsNoticeImage> asNoticeImages = asNoticeImageMapper.selectList(wrapper);

                // 遍历查询到的公告图片记录，逐个删除
                if (!asNoticeImages.isEmpty()) {
                    for (AsNoticeImage asNoticeImage : asNoticeImages) {
                        // 删除公告记录
                        asNoticeImageService.removeById(asNoticeImage.getId());
                        // 删除旧图片
                        qiniuUtil.delFile(asNoticeImage.getUrl());
                    }
                }
            }

            // 上传图片到七牛云存储，并获取图片URL
            String imageUrl = qiniuUtil.uploadImage(file);

            // 创建并保存公告信息
            AsNoticeImage newNoticeImage = new AsNoticeImage();
            newNoticeImage.setImageId(imageId != null ? imageId : 0); // 新公告的图片ID，如果没有传则设置为0
            newNoticeImage.setUrl(imageUrl); // 设置上传的新图片URL

            // 保存公告图片记录
            asNoticeImageService.save(newNoticeImage);

            // 构建响应，通知客户端公告创建成功，并提供图片URL
            response.put("message", "上传成功");
            response.put("imageUrl", imageUrl);
            return new ResponseEntity<>(response, HttpStatus.OK);

        } catch (Exception e) {
            // 处理异常情况，记录日志并返回错误响应
            response.put("message", "发生错误：" + e.getMessage());
            // 可以考虑记录日志以便后续排查问题
            e.printStackTrace();
            return new ResponseEntity<>(response, HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }
}
